package walkera.cn.httpserve.mApi;


import android.util.Log;

import java.util.List;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import walkera.cn.httpserve.bean.HttpClient;
import walkera.cn.httpserve.bean.PicBean;

/**
 *  对应一个模块的 http访问
 */
public class PicInfoApi {
    private final String TAG="PicInfoApi" ;
    private static PicInfoApi picInfoApi;
    private PicInfoService picInfoService;

    private PicInfoApi()
    {
        final String BASE_URL_PANDA = "https://www.aivin666.cn/AivinInfo/";
        picInfoService = HttpClient.getInstance(BASE_URL_PANDA).createApi(PicInfoService.class);
    }

    public static PicInfoApi getInstance()
    {
        if(picInfoApi == null)
        {
            picInfoApi = new PicInfoApi();
        }
        return picInfoApi;
    }



    public void getPicListByGet (Observer <List<PicBean> >subscriber , int pageNum)
    {
        // 通过操作符 map(...) 将接收的数据经过处理后再返回
        Observable observable = picInfoService.getPicListByGet(pageNum)  .flatMap( function );
        // 将观察者 和订阅者 关联起来
        toSubscribe(observable, subscriber);
    }

    public void getPicListByPost (Observer<List<PicBean>> subscriber , int pageNum)
    {
        // 通过操作符 map(...) 将接收的数据经过处理后再返回
        Observable   observable = picInfoService.getPicListByPost(pageNum) .flatMap( function );
        // 将观察者 和订阅者 关联起来
        toSubscribe(observable, subscriber);
    }

    private  void toSubscribe( Observable<List<PicBean>> o, Observer<List<PicBean>> s){
        // 运行在 io 线程中
       o.subscribeOn(Schedulers.io())
                //  取消订阅
                .unsubscribeOn(Schedulers.io())
                // 指定接收事件的线程
                .observeOn(AndroidSchedulers.mainThread())
                // 订阅
                .subscribe(s);
    }


    /***
     *  配合 操作符 map 使用
     *  Function<List<PicBean>, List<PicBean>>  第一个参数是输入数据类型 ， 第二个参数是输出类型 <br>
     *   List<PicBean> apply(List< PicBean> list)
     *   第一个   List<PicBean>  是返回数据类型 ， 第二个 List<PicBean>  是输入的数据类型
     *
     */
    private Function function = new Function<List<PicBean>,  Observable<List<PicBean> >     >() {
        @Override
        public Observable<List<PicBean> >   apply(List<PicBean> list) throws Exception {

            // 可以在这个函数里面进行数据过滤等处理
            if(list != null && list.size() > 0)
            {
                Log.i(TAG , " 数据处理="+ list.size()) ;
            }else{
                Log.i(TAG , " 数据处理  没有获取到数据") ;
            }
            return Observable.fromArray(list) ;
        }
    };


}
